package cn.jingyuan.swan.system.service;

import cn.jingyuan.swan.system.domain.sys.entity.Account;
import cn.jingyuan.swan.system.domain.sys.entity.AccountLoginLog;
import cn.jingyuan.swan.system.enums.SysAccStatusEnum;
import cn.jingyuan.swan.system.enums.SysAccountTypeEnum;

import java.util.List;

public interface AccountService {

    /**
     * 注册账号
     *
     * @param userId 用户 Id
     * @param account 账号
     * @param password 密码
     * @param accountType 账号类型
     * @param status 状态
     * @param registerIp 注册 ip
     *
     * @return 账号 id
     */
    Long register(Long userId, String account, String password, SysAccountTypeEnum accountType, SysAccStatusEnum status, String registerIp);

    /**
     * 记录登录日志
     *
     * @param loginLog 登录日志
     *
     * @return id 登录日志 id
     */
    Long loginLog(AccountLoginLog loginLog);

    /**
     * 删除账号
     *
     * @param accountId 账号 id
     */
    void deleteAccount(Long accountId);

    /**
     * 更新用户下账号密码：
     * <pre>
     *     1、以用户为单位进行更新密码；
     *     2、SysAccountType 为内部账号类型，则更新用户下所有内部账号密码；
     *     3、SysAccountType 为外部账号，则单独更新；
     * </pre>
     *
     * @param userId 用户 id
     * @param sysAccountType 账号类型
     * @param password 密码
     */
    Integer updatePassword(Long userId, SysAccountTypeEnum sysAccountType, String password);

    /**
     * 更新账号状态
     *
     * @param accountId 账号 id
     * @param status 账号状态
     *
     * @return 更新记录数
     */
    Integer updateStatus(Long accountId, SysAccStatusEnum status);

    /**
     * 依据 账号 id 获取账号
     *
     * @param accountId 账号 id
     *
     * @return 账号
     */
    Account getAccount(Long accountId);

    /**
     * 依据 “账号” 获取账号
     *
     * @param account 账号
     *
     * @return 账号
     */
    Account getAccount(String account);

    /**
     * 依据 用户 id 获取用户全部账号
     *
     * @param userId 用户 id
     *
     * @return 账号
     */
    List<Account> getAccounts(Long userId);

    /**
     * 依据 用户 id 获取用户给定账号
     *
     * @param accountIds 账号 id
     *
     * @return 账号
     */
    List<Account> getAccounts(List<Long> accountIds);

    /**
     * 依据 “账号”&& 账号类型获取账号
     *
     * @param account 账号
     * @param accountType 账号类型
     *
     * @return 账号
     */
    Account getAccount(String account, SysAccountTypeEnum accountType);

}
